package com.kuang.threadpool;

import java.util.concurrent.*;

/**
 * 创建线程池的3大方法，都有7大参数，参数含义是什么？
 *      corePoolSize,     // 核心线程池大小
 *      maximumPoolSize,  // 最大核心线程池大小
 *      keepAliveTime,    // 保持存活时长
 *      unit,             // 超时释放单位
 *      workQueue,        // 阻塞队列：默认最大21亿
 *      Executors.defaultThreadFactory(),  // 线程工厂，创建线程的，一般不动
 *      defaultHandler);  // 拒绝策略：默认AbortPolicy()堕胎政策
 *
 * 结合业务理解线程池及参数含义：
 *      银行办理业务：
 *      银行大厅 --> 线程池
 *      柜台：5个柜台：2个开设柜台，3个备用柜台  --> 最大核心线程数：5，核心线程数：2,
 *      候客区：3个座位 --> 阻塞队列
 *          1个人进去，直接办理
 *          5个人进去（3个人在候客厅）
 *          8个人进去（5个窗口都开放+3个在候客厅）
 *          9个人进去（多1个人，被拒绝进入，抛出异常）
 *          1个小时后，只剩2个窗口在服务，3个备用柜台就关闭释放
 */
public class Demo02 {
    // 1.单个线城池
    ExecutorService singleThread = Executors.newSingleThreadExecutor();
    // 2.创建一个固定的线程池大小
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
    // 3.可伸缩的，遇强则强，遇弱则弱
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

    // 本质：ThreadPoolExecutor  源码分析
    //public ThreadPoolExecutor(int corePoolSize,    // 核心线程池大小
    //                          int maximumPoolSize, // 最大核心线程池大小
    //                          long keepAliveTime,  // 超时了没有人调用就会释放
    //                          TimeUnit unit,       // 超时释放单位
    //                          BlockingQueue<Runnable> workQueue) { // 阻塞队列 链接阻塞队列LinkedBlockingQueue
    //    返回内容：
    //       this(corePoolSize,     // 核心线程池大小
    //            maximumPoolSize,  // 最大核心线程池大小
    //            keepAliveTime,    // 保持存活时长
    //            unit,             // 超时释放单位
    //            workQueue,        // 阻塞队列：默认最大21亿
    //            Executors.defaultThreadFactory(),  // 线程工厂，创建线程的，一般不动
    //            defaultHandler);  // 拒绝策略：默认AbortPolicy()堕胎政策
    //
    //public ThreadPoolExecutor(int corePoolSize,
    //                          int maximumPoolSize,
    //                          long keepAliveTime,
    //                          TimeUnit unit,
    //                          BlockingQueue<Runnable> workQueue,
    //                          ThreadFactory threadFactory,
    //                          RejectedExecutionHandler handler)
    //}





    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        ThreadPoolExecutor threadPool1 = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3));

        try {
            // 使用线程池
            for (int i = 1; i < 100; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName() + ":ok");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 线程池用完，线程结束，关闭线程池
            threadPool.shutdown();
        }
    }
}


